"""
@filename:main.py
@author：Caiyang
@time：2024--01
"""


import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
import matplotlib

# 设置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'Microsoft YaHei', 'STSong' 等
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 读取数据
df = pd.read_csv('artists.csv')

# 数据清理：去掉 'id' 列
df_cleaned = df.drop(columns=['id'])

# 检查年份格式并进行处理
def parse_years(years):
    years = years.replace(' ', '')  # 移除所有空格
    if '–' in years:  # 如果年份是一个范围（如 1884–1920）
        return int(years.split('–')[0])
    elif '-' in years:  # 如果年份是用 "-" 连接的（如 1884 - 1920）
        return int(years.split('-')[0])
    else:  # 如果只有一个年份
        return int(years)

# 处理年份：提取开始年份和结束年份
df_cleaned['start_year'] = df_cleaned['years'].apply(parse_years)
df_cleaned['end_year'] = df_cleaned['years'].apply(lambda x: int(x.split('–')[1]) if '–' in x else (int(x.split('-')[1]) if '-' in x else int(x.split('–')[0])))

# 生成柱状图：艺术家数目按起始年份分布
plt.figure(figsize=(10, 6))
sns.countplot(data=df_cleaned, x='start_year', palette='viridis')
plt.title('艺术家按起始年份分布')
plt.xticks(rotation=90)
plt.xlabel('起始年份')
plt.ylabel('数量')
plt.tight_layout()
plt.show()

# 生成条形图：艺术家数目按流派（genre）分布
plt.figure(figsize=(10, 6))
genre_counts = df_cleaned['genre'].value_counts().head(10)
sns.barplot(x=genre_counts.index, y=genre_counts.values, palette='Set2')
plt.title('前10大艺术流派的艺术家数量')
plt.xticks(rotation=45)
plt.xlabel('艺术流派')
plt.ylabel('数量')
plt.tight_layout()
plt.show()

# 生成饼状图：艺术家按国籍分布
plt.figure(figsize=(8, 8))
nationality_counts = df_cleaned['nationality'].value_counts().head(10)
plt.pie(nationality_counts, labels=nationality_counts.index, autopct='%1.1f%%', startangle=140, colors=sns.color_palette('Set3', len(nationality_counts)))
plt.title('前10大艺术家国籍分布')
plt.axis('equal')  # 确保饼图是圆形的
plt.tight_layout()
plt.show()

# 生成词云图：艺术家简介的关键词
text = ' '.join(df_cleaned['bio'].dropna())
wordcloud = WordCloud(width=800, height=400, background_color='white', colormap='Blues').generate(text)

plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('艺术家简介的关键词词云图')
plt.tight_layout()
plt.show()

# 1. 热力图：艺术家流派与国籍之间的关系
plt.figure(figsize=(10, 6))
# 创建一个透视表：行是流派，列是国籍，值是每个流派和国籍组合的数量
pivot_table = df_cleaned.groupby(['genre', 'nationality']).size().unstack(fill_value=0)
sns.heatmap(pivot_table, cmap='YlGnBu', annot=True, fmt='d', linewidths=0.5)
plt.title('艺术家流派与国籍关系热力图')
plt.xlabel('国籍')
plt.ylabel('艺术流派')
plt.tight_layout()
plt.show()

# 2. 线性回归：艺术家开始年份与结束年份的关系
plt.figure(figsize=(10, 6))
sns.regplot(x='start_year', y='end_year', data=df_cleaned, scatter_kws={'s': 10}, line_kws={'color': 'red'})
plt.title('艺术家开始年份与结束年份关系线性回归')
plt.xlabel('开始年份')
plt.ylabel('结束年份')
plt.tight_layout()
plt.show()

# 3. 散点图：艺术家开始年份与结束年份的关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x='start_year', y='end_year', data=df_cleaned, hue='genre', palette='Set1', s=100)
plt.title('艺术家开始年份与结束年份关系')
plt.xlabel('开始年份')
plt.ylabel('结束年份')
plt.tight_layout()
plt.show()

# 4. 时间序列图：不同年份内艺术家数量的变化
df_cleaned['decade'] = (df_cleaned['start_year'] // 10) * 10  # 创建按10年为单位的时间段
artist_counts_by_decade = df_cleaned['decade'].value_counts().sort_index()
plt.figure(figsize=(10, 6))
sns.lineplot(x=artist_counts_by_decade.index, y=artist_counts_by_decade.values, marker='o')
plt.title('不同时期艺术家数量变化')
plt.xlabel('年代')
plt.ylabel('艺术家数量')
plt.tight_layout()
plt.show()


